CFA LogoCFA Logo Computer
Загрузка поиска
Новости Компьютеры Прайс-лист [Новое] Прайс-лист [Б/У] Для ноутбуков Конфигуратор ПК Заказ, Оплата, Доставка Сервис объявления Драйвера Статьи Как нас найти Контакты
Новости
RSS канал новостей
Производители продолжают работать над заполнением фирменных линеек графических ускорителей NVIDIA ...
Компания Biostar анонсировала в эти дни первую для себя материнскую плату на чипсете AMD X370, который ...
Тайваньская компания ASUStek решила оживить интерес к своим игровым видеокартам выпуском двух новеньких ...
Компания Gigabyte Technology представила в эти дни модель видеокарты GeForce GTX 1080 Ti нестандартного ...
То, что энтузиасты ждали так долго, наконец-то случилось, и компания NVIDIA анонсировала свой новый ...
Самое интересное
Программаторы 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
Обновить






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