CFA LogoCFA Logo Computer
Новости Статьи Магазин Драйвера Контакты
Новости
RSS канал новостей
В конце марта компания ASRock анонсировала фирменную линейку графических ускорителей Phantom Gaming. ...
Компания Huawei продолжает заниматься расширением фирменной линейки смартфонов Y Series. Очередное ...
Компания Antec в своем очередном пресс-релизе анонсировала поставки фирменной серии блоков питания ...
Компания Thermalright отчиталась о готовности нового высокопроизводительного процессорного кулера ...
Компания Biostar сообщает в официальном пресс-релизе о готовности флагманской материнской платы ...
Самое интересное
Программаторы 25 SPI FLASH Адаптеры Optibay HDD Caddy Драйвера nVidia GeForce Драйвера AMD Radeon HD Игры на DVD Сравнение видеокарт Сравнение процессоров

АРХИВ СТАТЕЙ ЖУРНАЛА «МОЙ КОМПЬЮТЕР» ЗА 2003 ГОД

Решить задачу раз плюнуть

Олег ДАНИЛЮК

Продолжение, начало см. в МК № 3, 8 (226, 231).
Вы все еще рубите нечисть окровавленным мечом или спасаете заложников от верной смерти? Так вот почему вы не услышали звонок! А ну-ка дружно нажали на кнопочку Save. Вот так-то лучше, теперь начнем наш урок.

Сначала, как всегда, разберемся с домашним заданием. Вот задачка, которую я задавал:

Задача № 7

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

С этим заданием нужно быть очень осторожным. Помните, как иногда бывало на математике: вроде бы пример простенький, но сделали вы его неправильно. А все дело в том, что в нем есть изюминка, которая все портит. Вот так и с этой задачей. Нельзя забывать, что процент начисляется не к начальной сумме, а к той, которая на счету. То есть, если первоначальным вкладом было 100 зеленых, а процент годовых начислений равнялся 10%, то после второго года 10% добавится к 110$ (100$ + 10%) и будет составлять $11, а не $10. Вот мое решение этой задачи:

Как видите, все достаточно просто. Попробуйте сами написать программку, которая вычисляет период не только в годах, но и в месяцах. Например, если моя программка пишет, что первоначальный вклад удвоится через 4 года, то ваша должна писать, что он удвоится через 3 года и 7 месяцев или что-нибудь в этом роде…

А сейчас давайте разберемся со следующей задачей:

Задача № 8

Массив размером 45 заполнить следующим образом: четные строки — числом 2, нечетные — числом 3. Составить программу создания массива и полученный массив вывести на экран в виде матрицы.

Четность или нечетность строки можно узнать, разделив номер строки на два. Остаток будет равен нулю, если строка парная, и единице, если непарная.

Ну что, размялись? Пора бы решить задачу посложнее:

Задача № 9

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

Мало того, что эта задача сложнее, она еще и с приколом :-). Произведением всех элементов массива может оказаться очень большое число. «Ну и что?» — скажите вы, — «Тип Integer поддерживает числа вплоть до 32767». Но если подумать и посчитать, то произведение будет намного большим, и даже тип LongInt не сможет его охватить, в большинстве случаев. И тут на помощь нам приходит вещественный тип Real. Казалось бы, все проблемы решены. Но результат может удивить вас. Еще бы, ведь вы ожидали получить самое обычное число, а в итоге получилось что-то типа 1.85787014065422E+0018. Давайте разберемся, что это такое. Я постараюсь объяснить все как можно проще.

Такое представление числа называется формой записи с экспонентой. Число при этом представляется в виде множителя, называемого мантиссой, умноженного на 10 в какой-то степени. Это можно показать так: ЧИСЛО=МАНТИССА*10k, где k — степень (порядок). Например: 4.3E+3 = 4.3*103 = 4.3*1000 = 4300, то есть мантисса 4.3 умножается на 10 в третьей степени; -2.284E-5 = -2.284*10-5 = -2.284*0.00001 = -0.00002284, то есть отрицательная мантисса -2.284 умножается на 10 в минус пятой степени или 0.00001.

Вещественные типы имеют одну очень интересную особенность. Если целочисленной (Integer) переменной присвоить значение 2.1 и вывести ее на экран, то мы увидим 2.1. Но если вместо целочисленной взять вещественную (Real) переменную, то получим… 2.09999999999854E+0000, то есть на 0.0000000000146 меньше, чем 2.1. Вот это и есть та особенность — результат никогда не будет абсолютно точным. Чтобы добиться большей точности, можно использовать более точные вещественные типы. Например, если в указанном выше примере переменная будет иметь тип Extended, то результатом будет 2.10000000000000E+0000, или 2.1. Но если присвоить данной переменной значение 2.123456789012345, то результат будет немножечко другим: 2.12345678901235E+0000. Разница очень маленькая и состоит только в последней цифре 5.

Кстати, если вы захотите заполнить массив большими числами, то тип Real «не потянет» их произведение, и вам придется использовать дополнительные вещественные типы, такие как Single, Double, Extended, Comp. Но учтите, если у вас в опциях (команда меню Options > Compiler) не отмечен крестиком пункт 8087/80287, то компилятор выдаст сообщение об ошибке.

Это все, что я хотел сказать о вещественных типах. Теперь перейдем к решению задачи:

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

Задача №10

Линейный массив размерностью N заполнить случайными числами из интервала от A до B. Найти сумму всех чисел.

Данная задача имеет две особенности. Во-первых, не указана размерность массива, а если написать m: array[1..n] of Integer, то при компиляции получите ошибку: Cannot evaluate this expression, что переводится как «не могу оценить это выражение». «Как же быть?» — скажете вы. Все очень просто. Если нам не сообщили размерность массива, то мы сами ее укажем — с запасом. Например, можно написать m: array[1..20000] of Integer. Мало не покажется :-). Правда, можно использовать динамический массив, но это совсем другая, причем не такая уж и простая история.

Во-вторых, нам не дан строгий интервал чисел для заполнения массива. Но и эта проблема решается достаточно просто. Нужно написать x := Random(B-A+1) + A. Если задуматься, то становится понятно, что минимальное случайное число будет 0+A=A, а максимальное B-A+A=B. Единицу мы добавляем, так как функция Random возвращает случайное число в диапазоне 0<=X<B-A, а с единицей — в диапазоне 0<=X<=B-A. Вот и все сложности, которые могут возникнуть с этой задачей. Взгляните на ее решение:

Вот и закончился очередной урок; осталось только задать домашнее задание:

Задача № 11

Ввести в программу три числа. Разделить максимальное на минимальное. Вывести на экран значение трех данных чисел и полученный результат.

До следующих встреч на страницах МК!

Рекомендуем ещё прочитать:






Данную страницу никто не комментировал. Вы можете стать первым.

Ваше имя:
Ваша почта:

RSS
Комментарий:
Введите символы или вычислите пример: *
captcha
Обновить





Хостинг на серверах в Украине, США и Германии. © sector.biz.ua 2006-2015 design by Vadim Popov