Задача № 30. Вывести таблицу квадратов и кубов всех натуральных чисел до n
Формулировка. Дано натуральное число n, меньшее 256. Используя псевдографику, вывести на экран таблицу квадратов и кубов всех натуральных чисел от 1 до n включительно.
Примечание: псевдографика – это совокупность символов для формирования видимых графических примитивов (линий, прямоугольников, рамок, таблиц и т. д.). Она была актуальна в те далекие времена, когда устройства вывода компьютеров не способны были работать с графикой, либо это было проблематично.
Символы, использующиеся для псевдографики, должны быть включены в набор используемого в терминале (консоли) компьютерного шрифта.
Решение. В этой задаче мы впервые займемся графическим оформлением выходных данных программы. Для начала подумаем, как может выглядеть таблица в простейшем случае (n = 3):
x | x2 | x3 |
1 2 3 | 1 4 9 | 1 8 27 |
Несмотря на то, что кодовые страницы для DOS имеют определенный набор символов для рисования графических примитивов, в частности, таблиц, мы будем пользоваться лишь символами '-' и '|' для построения линий таблицы, а также '/' и '\' для формирования ее угловых элементов.
Построим псевдографический эквивалент этой таблицы:
/-----------------------\
| x | x^2 | x^3 |
|-----------------------|
| 1 | 1 | 1 |
| 2 | 4 | 8 |
| 3 | 9 | 27 |
\-----------------------/
Примечание: в случае ограниченных возможностей вывода для обозначения возведения выражения в степень используется постфикс «^ k», где k – показатель степени. Кстати, здесь мы выравниваем значения в середине столбцов, сдвигая к середине разряд единиц упорядоченных по правому краю столбцов.
|
|
Как же сформировать вывод на экран такой таблицы? Понятно, что это нужно сделать построчно. Однако какой ширины сделать таблицу и как организовать вывод строк со степенями? Так как максимальное число, которое может быть подано на вход – 255, и его куб равен 16581375 (он состоит из 8 цифр), то нам нужно сделать колонки ширины 1 + 8 + 8 + 1 = 18 (крайние единицы для отступов) символов, чтобы таблица выглядела равномерно:
/--------------------------------------------------------\
| x | x^2 | x^3 |
|--------------------------------------------------------|
| 1 | 1 | 1 |
| 2 | 4 | 8 |
| ... | ... | ... |
| 255 | 65025 | 16581375 |
\--------------------------------------------------------/
Как видим, при постепенном увеличении числа будут «вырастать» справа налево. Чтобы вывести такую строку, нужно вывести константу '|', затем вывести соответствующее число с шириной поля вывода 9, потом вывести константу '|' с шириной поля вывода 10 и аналогично вывести оставшиеся колонки:
writeln('|', i:9, '|':10, i * i:9, '|':10, i * i * i:9, '|':10);
Схематически с учетом форматирования это будет выглядеть так:
|
|
'| 255 | 65025 | 16581375 |'
Изменение цветов соответствует чередованию аргументов в операторе вывода.
Так как заголовок таблицы один и тот же для всех вариантов исходных данных, мы можем сразу вывести его с помощью трех строковых констант через writeln:
writeln('/--------------------------------------------------------\');
writeln('| x | x^2 | x^3 |');
writeln('|--------------------------------------------------------|');
После вывода всех строк нужно вывести нижнюю границу таблицы:
writeln('\--------------------------------------------------------/');
Вообще, все эти константы и правила не взялись «просто так» или из расчетов. Единственный использованный факт – разрядность числа не более 8, поэтому мы и взяли ширину колонок «по максимуму». В остальном нужно было экспериментировать, чтобы найти наиболее легкое и наглядное решение. Конечно, псевдографика – это не алгоритмическое программирование, и в нем тестирование и эксперимент играют чуть ли не самую важную роль.
Код:
1. program MyTable; 2. 3. var 4. i, n: byte; 5. 6. begin 7. readln(n); 8. writeln('/--------------------------------------------------------\'); 9. writeln('| x | x^2 | x^3 |'); 10. writeln('|--------------------------------------------------------|'); 11. for i := 1 to n do begin 12. writeln('|', i:9, '|':10, i * i:9, '|':10, i * i * i:9, '|':10) 13. end; 14. writeln('\--------------------------------------------------------/') 15. end. |
Задача № 31. Сформировать реверсную запись заданного числа
|
|
Формулировка. Дано натуральное число n заранее неизвестной разрядности. Сформировать и вывести на экран число, представляющее собой реверсную запись n.
Решение. Это более общий случай задачи 4, в которой при случае трехзначного n отчетливо видны повторяющиеся фрагменты кода. Попытаемся получить общий алгоритм решения через цикл.
Пусть дано число 25893. Возьмем его последнюю цифру как остаток от деления на 10 – это 3. Очевидно, она должна быть первой. Отбросим ее у числа n и возьмем последнюю цифру 9 – она должна быть второй. Чтобы сформировать две цифры реверсного числа, умножим 3 на 10 и прибавим 9, потом добавим третью цифру и т. д.
Так как разрядность числа неизвестна, мы будем использовать цикл с предусловием. Его тело будет выглядеть так:
r := r * 10;
r := r + n mod 10;
n := n div 10;
Поначалу результат r должен быть равен 0, и тогда умножение нуля на 10 в первом шаге не разрушает формирование реверсной записи, которое теперь может быть заключено в один цикл.
Каким же будет условие продолжения? Нетрудно понять, что когда мы будем добавлять последнюю оставшуюся цифру исходного числа n к реверсной записи r, мы умножим r на 10, прибавим к ней как n mod 10 (в данном случае этот остаток равен n) и разделим n на 10. Тогда n станет равно 0 и цикл должен закончиться, так что условие его продолжения – n < > 0.
|
|
Код:
Дата добавления: 2018-10-25; просмотров: 395; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!