Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по программированию..pdf
Скачиваний:
10
Добавлен:
15.11.2022
Размер:
12.2 Mб
Скачать

Задания

1. Даны декартовы координаты N точек на плоскости. Составить программы решения следующих задач:

а) найти две самые близкие друг к другу точки; б) найти две самые удаленные друг от друга точки;

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

жить радиусом окружности, заключающей внутри себя все остальные точки; указать, какая из них является центральной.

2.Изменить программу Labirint таким образом, чтобы на печать выводился лишь кратчайший путь из центра лабиринта до края.

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

4.Составить программу расстановки на шахматной доске восьми ферзей так, чтобы они не угрожали друг другу.

Для решения поставленной задачи потребуется выполнение следую­ щих действий:

1)ввод длинного числа;

2)собственно умножение двух “длинных” чисел;

3)вывод длинного числа;

4)определение количества цифр в записи числа.

Каждую из подзадач реализуем в виде отдельной подпрограммы. Начнем с ввода. Ввести большое число целесообразно в виде строки, после чего эта строка преобразуется в массив цифр.

{Процедура преобразования длинного числа., записанного в виде строки, в массив цифр} Procedure Translate(S Stroka; Var A DIChislo);

Var I, Code

Integer;

Begin

 

Zero(A);

For I :» StrLen(S) - 1 DownTo 0 Do

Val(S[I], A[StrLen(S) - I], Code);

End;

В процедуре используется подпрограмма Zero (А), которая предна­ значена для записи нуля в каждый разряд длинного числа. Вот текст этой процедуры:

{Процедура обнуления длинного числа}

Procedure Zero(Var A DIChislo);

Var I Integer;

Begin

For I := 1 To NMax Do

A[I] :* 0;

End;

Таким образом, длинное число записано в массив, в котором пер­ выми элементами могут оказаться незначащие нули. При выполнении вычислений и выводе результата они не будут учитываться. В проце­ дуре Translate использована функция StrLen(S) из модуля Strings, которая позволяет определить длину строки S.

Разработаем функцию определения количества значащих цифр в за­ писи числа, поскольку она потребуется при реализации подпрограммы умножения.

{Функция определения количества цифр в записи длинного числа}

Function Dlina(C DIChislo) Integer;

Var I Integer;

Begin

I := NMax;

While (I > 1) And (С[I] = 0) Do

I := I - 1;

Dlina := I

End;

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

Ну и, наконец, главная процедура, ради которой и была проделана вся предшествующая работа. При составлении алгоритма использу­ ется идея умножения “столбиком” В отличие от “ручного” умноже­ ния, в процедуре сложение выполняется не после окончания умножения, а по ходу его. После перемножения очередных цифр результирующая цифра добавляется в нужный разряд и формируется перенос в следу­ ющий разряд.

PROCEDURE

Multiplication^, В DIChislo; Var С DIChislo);

Var I,

J,

VspRez

Integer;

P

Digit;

 

Begin

 

 

 

Zero(C);

For I := 1 To Dlina(A) Do {Цикл по количеству цифр в первом чи­

сле} Begin

Р := 0; {Первоначально перенос равен нулю}

For J := 1 То Dlina(B) Do {Цикл по количеству цифр во втором числе}

Begin

VspRez := А [I] * B[J] + Р + С [I + J - 1] ;

С [I + J - 1] := VspRez Mod 10; {Очередное значение цифры

вразряде I + J - 1}

Р:= VspRez Div 10 {Перенос в следующий разряд}

End;

C[I + J] :» Р

End

End;